package org.sample;

import com.huaban.analysis.jieba.JiebaSegmenter;
import com.huaban.analysis.jieba.SegToken;

import java.util.*;

public class Segmentation {

    public static void main(String[] args) {
        Map<String, Integer> map = new TreeMap<>();
        String text = "有美联储官员也在当日的讲话中表示，可能很快有理由降息。\n" +
                "谷歌控制全球搜索引擎70%份额\n" +
                "2018年，Alphabet的收入达到1368亿美元，其中85%来自广告。根据NetMarketShare的数据，谷歌目前控制着全球搜索引擎市场70%以上的份额。谷歌在网络浏览器、移动操作系统、电子邮件和许多其他产品类别的市场上也占据着同样的主导地位，所有这些都有助于其收集数据和服务目标广告群体。\n" +
                "此外，这也并不是谷歌第一次因为反垄断而遭到监管机构的调查。2010年，谷歌收到了欧盟委员会关于购物搜索结果和广告排名的反垄断投诉，根据Alphabet的最新年报，这导致谷歌在2017年被罚款27亿美元；2011年，美国贸易委员会（FTC）对谷歌处以了数十亿美元的罚款，这些罚款涉及谷歌的搜索业务、谷歌与安州操作系统捆绑的软件，以及谷歌在使用AdSense系统时强迫客户前述的竞业合同；2013年，谷歌表示与FTC达成和解协议。《华尔街日报》的报道中称，此次司法部正在牵头对谷歌进行一项全新的反垄断评估。\n" +
                "2016年，欧盟委员会再次将矛头对准谷歌，对谷歌安卓操作系统的相关行为进行了投诉，导致谷歌2018年被罚款51亿美元。今年3月，欧盟又因一些非法的广告原因罚款谷歌17亿美元。欧盟方面针对谷歌的这三次罚款，总额达到惊人的95亿美元。\n" +
                "最近，谷歌在美国大本营也面临着巨大压力。特朗普一直对大型科技公司持批评态度，包括指责谷歌在其搜索结果中存在偏见。今年3月，特朗普在推特上公开指责谷歌的YouTube和推特偏爱民主党的对手，使共和党人处于不利的位置。\n" +
                "或面临被分拆命运\n" +
                "去年12月宣布参加2020年总统竞选的参议员伊丽莎白·沃伦也一直在敦促拆分谷歌等科技公司。\n" +
                "“多年来，我一直在谈论谷歌是如何扼杀竞争的。”沃伦表示。她还补充称，谷歌和其他在线巨头的“权力太大”，他们利用这种权力伤害小企业，扼杀创新，并使竞争环境向其他所有人倾斜。“现在是反击的时候了。”\n" +
                "此外，对谷歌采取行动，也符合美国司法部反垄断负责人马坎·德拉希姆的议程。德拉希姆是特朗普的提名人，一直在谈论让互联网公司接受更密切审查的想法。在去年的一次演讲中，德拉希姆曾表示，“如果有明确的证据表明数字平台上的竞争受到损害，执法人员必须采取有力行动，寻求保护美国消费者的补救措施。”\n" +
                "《华尔街日报》上述报道发布后，猫途鹰CEO斯蒂芬·考弗就对谷歌可能面临司法部反垄断审查的消息表示欢迎。考弗在一份声明中说：“猫途鹰仍然关注谷歌在美国、欧盟和世界各地的做法。为了消费者的利益和互联网上的公平竞争，我们欢迎美国监管机构对谷歌的反竞争行为重新展开调查。”\n" +
                "每日经济新闻记者也注意到，谷歌并不是第一家面临司法部调查的美国科技公司。1998年，美国司法部就曾发起了一项针对微软的重大反垄断诉讼。但需要指出的是，美国司法部上一次针对大型科技公司进行调查并“获胜”，还要追溯到1984年，当时导致美国电话电报公司（AT&T）的垄断地位瓦解。对于此次针对谷歌的调查，美国司法部不与置评，谷歌也没有回复媒体的置评请求。\n" +
                "更严监管恐对利润有负面影响\n" +
                "《华盛顿邮报》的最新报道称，美国顶级的反垄断机构们就监管科技行业达成了新协议。据《华盛顿邮报》的报道，美国联邦贸易委员会（FTC）与司法部已经达成协议。FTC将主导对亚马逊的监管，而司法部将主导对谷歌的调查。\n" +
                "而据《华尔街日报》报道，FTC将主导监督对Facebook的反垄断审查事宜，以确定该公司的做法是否会损害数字市场的竞争。另外据路透社的报道，美国司法部正考虑对苹果公司进行反垄断调查。\n" +
                "总部位于华盛顿的消费者权益保护组织主席Gene Kimmelman在接受采访时说，“这对谷歌和亚马逊来说应该是一个警醒，他们应该做得更好。”\n" +
                "而对于投资者来说，更严格的监管对利润意味着负面影响，使得科技巨头难以支撑目前的高估值。\n" +
                "美联储官员讲话暗示降息\n" +
                "当日除了美科技股暴跌，来自美联储官员的讲话也引发市场关注。\n" +
                "圣路易斯联储主席布拉德表示，全球贸易紧张和美国通胀疲软，令美国经济增长的风险不断上升，美联储降息“可能很快得到保证”。\n" +
                "布拉德表示，预期的美国经济增速放缓程度可能超乎想象。尽管美联储不能回应快速发展的贸易争端中每一处新变化，但上周白宫意外宣布对墨西哥全部进口征收关税的决定等，已经创造了一个充满“高企不确定性”的环境，可能会反馈到美国宏观经济表现中；更何况，目前美国还处于全球经济动能放缓的大背景。\n" +
                "布拉德的讲话消息发布后，美国联邦基金利率期货暗示，交易员认为美联储在9月降息的概率为约88%，高于此前的85%。交易员认为美联储12月降息的概率为接近98%，高于布拉德讲话前不久的97%。\n" +
                "与此同时，美债收益率继续扩大跌幅。对政策利率更敏感的两年期美债收益率日内跌8个基点，跌破1.87%；更能反映市场对经济前景展望的10年期美债收益率报2.0969%，日内跌超4个基点，美股盘前触及2.071%的2017年9月以来最低。3个月与10年期美债收益率利差扩大至近负25个基点，曲线倒挂程度不断刷新2007年以来最深。";

        List<SegToken> process = new JiebaSegmenter().process(text, JiebaSegmenter.SegMode.INDEX);
        Iterator<SegToken> tokenIterator = process.iterator();
        while (tokenIterator.hasNext()) {
            String word = tokenIterator.next().word;
            Integer count = map.get(word);
            if (count == null) count = 0;
            map.put(word, ++count);
        }

//        char[] chars = text.toCharArray();
//        for (Character c : chars) {
//            String word = c.toString();
//            Integer count = map.get(word);
//            if (count == null) count = 0;
//            map.put(word, ++count);
//        }

        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        List<KV> list = new ArrayList<>(entries.size());
        for (Map.Entry<String, Integer> entry : entries)
            list.add(new KV(entry.getKey(), entry.getValue()));
        list.sort(Comparator.comparingInt(KV::getValue).reversed());
        for (KV kv : list)
            System.out.println(kv.getValue() + " : " + kv.getKey());
    }

    static class KV {
        private String key;
        private int value;

        public KV(String key, int value) {
            this.key = key;
            this.value = value;
        }

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }
    }
}